package org.puc.enquete.ejb;

import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.puc.enquete.beanfiltro.EnqueteFiltro;
import org.puc.enquete.entity.Enquete;
import org.puc.enquete.excecoes.EnqueteJaExisteException;
import org.puc.enquete.excecoes.EnqueteNaoCadastradaException;

@Stateless
public class EnqueteBean implements EnqueteBeanLocal {

    @PersistenceContext
    EntityManager manager;

    public List<Enquete> listarEnquetes(EnqueteFiltro filtro) {

        Query q = manager.createNamedQuery("Enquete.findAll");
        q.setParameter("idUsuario", filtro.getUsuario());
        q.setParameter("dataAtual", new Date());

        return (List<Enquete>) q.getResultList();

    }

    public Enquete recuperaEnquete(Integer id) throws EnqueteNaoCadastradaException {

        Query q = manager.createNamedQuery("Enquete.findById");
        q.setParameter("id", id);

        try {

            return (Enquete) q.getSingleResult();

        } catch (NoResultException e) {

            throw new EnqueteNaoCadastradaException("Enquete '" + id + "' não cadastrada!");

        }

    }

    public Enquete obterEnquete(Integer id) throws EnqueteNaoCadastradaException {

        Query q = manager.createNamedQuery("Enquete.findById");
        q.setParameter("id", id);

        try {

            Enquete e = (Enquete) q.getSingleResult();
            manager.refresh(e);
            return e;

        } catch (NoResultException e) {

            throw new EnqueteNaoCadastradaException("Enquete '" + id + "' não cadastrada!");

        }

    }

    public void incluirEnquete(Enquete enquete) throws EnqueteJaExisteException {


        try {

            //tenta recuperar o usuário (uma exceção é lançada se o mesmo não existir
            recuperaEnquete(enquete.getId());

            //se encontrou um usuário, lança este erro
            throw new EnqueteJaExisteException("Enquete '" + enquete.getTitulo() + "' já xiste!");

        } catch (EnqueteNaoCadastradaException e) {

            //se não encontrou, inclui o usuário
            manager.persist(enquete);
            manager.flush();

        }
        
    }
    public void alterarEnquete(Enquete enquete) {

        manager.merge(enquete);
        manager.flush();

    }


    public void excluirEnquete(Enquete enquete) {
        try {
            Enquete enqueteAtual = manager.find(Enquete.class,enquete.getId());
            manager.remove(enqueteAtual);
        } catch (Exception ex) {
            Enquete enqueteAtual = manager.find(Enquete.class,enquete.getId());
            manager.remove(enqueteAtual);
            Logger.getLogger(EnqueteBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
